<?php

namespace Tests;

/**
 * 测试文件管理器
 * 用于管理测试过程中使用的各种文件资源
 */
class TestFileManager
{
    private static string $testDir;
    private static array $testFiles = [];
    
    public static function init(): void
    {
        self::$testDir = __DIR__;
        self::registerTestFiles();
    }
    
    /**
     * 注册测试文件
     */
    private static function registerTestFiles(): void
    {
        self::$testFiles = [
            'pdf' => [
                'helloworld' => [
                    'path' => self::$testDir . '/helloworld.pdf',
                    'description' => 'Hello World PDF测试文件',
                    'size' => '约2KB',
                    'pages' => 1,
                    'format' => 'A4',
                    'content' => 'Hello World文本内容'
                ]
            ],
            'images' => [
                // 可以添加图片测试文件
            ],
            'documents' => [
                // 可以添加其他文档测试文件
            ]
        ];
    }
    
    /**
     * 获取PDF测试文件路径
     */
    public static function getPdfTestFile(string $name = 'helloworld'): string
    {
        if (!isset(self::$testFiles['pdf'][$name])) {
            throw new \InvalidArgumentException("PDF测试文件 '{$name}' 不存在");
        }
        
        $filePath = self::$testFiles['pdf'][$name]['path'];
        
        if (!file_exists($filePath)) {
            throw new \RuntimeException("PDF测试文件不存在: {$filePath}");
        }
        
        return $filePath;
    }
    
    /**
     * 验证PDF文件是否有效
     */
    public static function validatePdfFile(string $filePath): bool
    {
        if (!file_exists($filePath)) {
            return false;
        }
        
        // 检查文件头是否为PDF格式
        $handle = fopen($filePath, 'rb');
        if (!$handle) {
            return false;
        }
        
        $header = fread($handle, 4);
        fclose($handle);
        
        return $header === '%PDF';
    }
    
    /**
     * 获取PDF文件信息
     */
    public static function getPdfFileInfo(string $name = 'helloworld'): array
    {
        if (!isset(self::$testFiles['pdf'][$name])) {
            throw new \InvalidArgumentException("PDF测试文件 '{$name}' 不存在");
        }
        
        $fileInfo = self::$testFiles['pdf'][$name];
        $filePath = $fileInfo['path'];
        
        if (file_exists($filePath)) {
            $fileInfo['actual_size'] = filesize($filePath);
            $fileInfo['last_modified'] = filemtime($filePath);
            $fileInfo['is_readable'] = is_readable($filePath);
            $fileInfo['mime_type'] = mime_content_type($filePath);
        }
        
        return $fileInfo;
    }
    
    /**
     * 创建临时测试PDF文件
     */
    public static function createTempPdfFile(string $content = 'Test Content'): string
    {
        $tempFile = tempnam(sys_get_temp_dir(), 'test_pdf_');
        
        // 创建简单的PDF内容
        $pdfContent = "%PDF-1.4\n";
        $pdfContent .= "1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n";
        $pdfContent .= "2 0 obj\n<< /Type /Pages /Kids [3 0 R] /Count 1 >>\nendobj\n";
        $pdfContent .= "3 0 obj\n<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] >>\nendobj\n";
        $pdfContent .= "xref\n0 4\n0000000000 65535 f \n0000000010 00000 n \n";
        $pdfContent .= "0000000053 00000 n \n0000000125 00000 n \n";
        $pdfContent .= "trailer\n<< /Size 4 /Root 1 0 R >>\nstartxref\n200\n%%EOF";
        
        file_put_contents($tempFile, $pdfContent);
        
        return $tempFile;
    }
    
    /**
     * 清理临时文件
     */
    public static function cleanupTempFiles(): void
    {
        $tempDir = sys_get_temp_dir();
        $pattern = $tempDir . '/test_pdf_*';
        
        foreach (glob($pattern) as $file) {
            if (is_file($file)) {
                unlink($file);
            }
        }
    }
    
    /**
     * 获取所有可用的测试文件列表
     */
    public static function getAvailableTestFiles(): array
    {
        return self::$testFiles;
    }
    
    /**
     * 检查测试文件完整性
     */
    public static function checkTestFilesIntegrity(): array
    {
        $results = [];
        
        foreach (self::$testFiles as $category => $files) {
            foreach ($files as $name => $info) {
                $filePath = $info['path'];
                $results["{$category}/{$name}"] = [
                    'exists' => file_exists($filePath),
                    'readable' => is_readable($filePath),
                    'size' => file_exists($filePath) ? filesize($filePath) : 0,
                    'path' => $filePath
                ];
                
                if ($category === 'pdf') {
                    $results["{$category}/{$name}"]['valid_pdf'] = self::validatePdfFile($filePath);
                }
            }
        }
        
        return $results;
    }
}

// 初始化测试文件管理器
TestFileManager::init();